/******************************************************************************
* 文件名称: task.h
* 创建者の: 孔佳伟
* 个人主页: https://gitee.com/thin-wind/jump
* 修改记录: 
******************************************************************************/

#ifndef __TASK_H_
#define __TASK_H_

#include "portmacro.h"
#include "list.h"
#include "projdefs.h"

// 触发 PendSV 中断，切换任务
#define taskYIELD()                     portYIELD()

// 进入临界段，不带中断保护版本，不能嵌套
#define taskENTER_CRITICAL()            portENTER_CRITICAL()

// 进入临界段，带中断保护版本，可以嵌套
#define taskENTER_CRITICAL_FROM_ISR()   portSET_INTERRUPT_MASK_FROM_ISR()

// 退出临界段，不带中断保护版本，不能嵌套
#define taskEXIT_CRITICAL()             portEXIT_CRITICAL()

// 退出临界段，带中断保护版本，可以嵌套
#define taskEXIT_CRITICAL_FROM_ISR(x)   portCLEAR_INTERRUPT_MASK_FROM_ISR(x)

// 定义空闲任务优先级
#define tskIDLE_PRIORITY                ((UBaseType_t)0U)

typedef struct tskTaskControlBlock
{
    volatile StackType_t*   pxTopOfStack;       // 栈顶
    ListItem_t              xStateListItem;     // 任务节点，通过这个节点，可以将任务控制块挂接到各种链表中
    StackType_t*            pxStack;            // 任务栈起始地址
    char pcTaskName[configMAX_TASK_NAME_LEN];   // 任务名称，字符串形式
    TickType_t              xTicksToDelay;      // 记录任务延时时间
    UBaseType_t             uxPriority;         // 任务优先级，数值越大，优先级越高
} tskTCB;
typedef tskTCB TCB_t;

typedef void* TaskHandle_t;

extern TCB_t* pxCurrentTCB;

// 创建任务，其本质是实例化 TCB 任务控制块
TaskHandle_t xTaskCreateStatic( TaskFunction_t pxTaskCode,          /* 任务入口 */
                                const char* const pcName,           /* 任务名称，字符串形式 */
                                const uint32_t ulStackDepth,        /* 任务栈大小，单位为字 */
                                void* const pvParameters,           /* 任务形参 */
                                UBaseType_t uxPriority,             /* 任务优先级，数值越大，优先级越高 */
                                StackType_t* const puxStackBuffer,  /* 任务栈起始地址 */
                                TCB_t* const pxTaskBuffer           /* 任务控制块指针 */
                                );

// 就绪列表初始化
void prvInitialiseTaskLists(void);
									
// 开启调度
void vTaskStartScheduler(void);

// 任务切换
void vTaskSwitchContext(void);

// 任务阻塞延时
void vTaskDelay(const TickType_t xTicksToDelay);

// 更新系统时基
BaseType_t xTaskIncrementTick(void);


#endif
